package br.com.senac.digipao.dao;

import br.com.senac.digipao.bean.ContasPagar;
import br.com.senac.digipao.bean.ContasReceber;
import br.com.senac.digipao.bean.Usuario;
import br.com.senac.digipao.connection.ConexaoDB;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ContasDao {

    static PreparedStatement ps;

    // a conexão com o banco de dados
    private final Connection conexao;

    public ContasDao() throws SQLException {
        this.conexao = new ConexaoDB().getConexao();
    }

    public void adicionaContasPagar(ContasPagar contasPagar) throws SQLException {

        // prepara a conexão
        String sql = "insert into tb_contaspagar(idContasPagar,descricaoConta,dataCadastro,dataVencimento,dataPagamento) values ( ? , ? , ? , ?, ? )";

        try (PreparedStatement stmt = conexao.prepareStatement(sql)) {

            stmt.setInt(1, contasPagar.getIdContasPagar());
            stmt.setString(2, contasPagar.getDescricaoConta());
            stmt.setString(3, contasPagar.getDataCadastro());
            stmt.setString(4, contasPagar.getDataVencimento());
            stmt.setString(5, contasPagar.getDataPagamento());

            //Executa o código SQL
            stmt.execute();
            stmt.close();
        }
    }

    public void adicionaContasReceber(ContasReceber contasReceber) throws SQLException {

        // prepara a conexão
        String sql = "insert into tb_contasreceber(idContasReceber,descricaoConta,dataCadastro,dataVencimento,dataRecebimento) values ( ? , ? , ? , ?, ? )";

        try (PreparedStatement stmt = conexao.prepareStatement(sql)) {

            stmt.setInt(1, contasReceber.getIdContasReceber());
            stmt.setString(2, contasReceber.getDescricaoConta());
            stmt.setString(3, contasReceber.getDataCadastro());
            stmt.setString(4, contasReceber.getDataVencimento());
            stmt.setString(5, contasReceber.getDataRecebimento());

            //Executa o código SQL
            stmt.execute();
            stmt.close();
        }
    }

    public void alteraContasPagar(ContasPagar contasPagar) throws SQLException {
        String sql = "update tb_contaspagar set descricaoConta = ? , dataCadastro = ? , dataVencimento = ? , dataPagamento = ? where idContasPagar = ? ";

        try (PreparedStatement stmt = this.conexao.prepareStatement(sql)) {
           
            stmt.setString(1, contasPagar.getDescricaoConta());
            stmt.setString(2, contasPagar.getDataCadastro());
            stmt.setString(3, contasPagar.getDataVencimento());
            stmt.setString(4, contasPagar.getDataPagamento());
            stmt.setInt(5, contasPagar.getIdContasPagar());

            //executar a query
            stmt.execute();
            stmt.close();
        }
    }

    public void alteraContasReceber(ContasReceber contasReceber) throws SQLException {

        String sql = "update tb_contasreceber set descricaoConta = ? , dataCadastro = ? , dataVencimento = ? , dataRecebimento = ? where idContasReceber = ?";
    
        try (PreparedStatement stmt = this.conexao.prepareStatement(sql)) {
            
            stmt.setString(1, contasReceber.getDescricaoConta());
            stmt.setString(2, contasReceber.getDataCadastro());
            stmt.setString(3, contasReceber.getDataVencimento());
            stmt.setString(4, contasReceber.getDataRecebimento());
            stmt.setInt(5, contasReceber.getIdContasReceber());

            //executar a query
            stmt.execute();
            stmt.close();
        }
        
    }
    
    public List<ContasPagar> listaContasPagarParametros(String parametro) throws SQLException {
        // prepara a conexão
        boolean duplicado = false;
        List<ContasPagar> listaContasPagar = new ArrayList<>();

        String sql = "select * from tb_contaspagar where descricaoConta LIKE '%" + parametro + "%'";

        PreparedStatement preparedStatement = conexao.prepareStatement(sql);
        ResultSet rs = preparedStatement.executeQuery(sql);

        while (rs.next()) {
            ContasPagar contasPagar = new ContasPagar();
            contasPagar.setIdContasPagar(rs.getInt("idContasPagar"));
            contasPagar.setDescricaoConta(rs.getString("descricaoConta"));
            contasPagar.setDataPagamento(rs.getString("dataPagamento"));
            contasPagar.setDataVencimento(rs.getString("dataVencimento"));
            contasPagar.setDataCadastro(rs.getString("dataCadastro"));
            listaContasPagar.add(contasPagar);
        }

        sql = "select * from tb_contaspagar where dataPagamento LIKE '%" + parametro + "%'";

        preparedStatement = conexao.prepareStatement(sql);
        rs = preparedStatement.executeQuery(sql);

        while (rs.next()) {
             duplicado = false;
            for (int i = 0; i < listaContasPagar.size(); i++) {
                if (listaContasPagar.get(i).getIdContasPagar()== rs.getInt("idContasPagar")) {
                    duplicado = true;
                    break;
                }
            }
            if (!duplicado) {
            ContasPagar contasPagar = new ContasPagar();
            contasPagar.setIdContasPagar(rs.getInt("idContasPagar"));
            contasPagar.setDescricaoConta(rs.getString("descricaoConta"));
            contasPagar.setDataPagamento(rs.getString("dataPagamento"));
            contasPagar.setDataVencimento(rs.getString("dataVencimento"));
            contasPagar.setDataCadastro(rs.getString("dataCadastro"));
            listaContasPagar.add(contasPagar);
                duplicado = false;
            }
        }

        sql = "select * from tb_contaspagar where dataVencimento LIKE '%" + parametro + "%'";

        preparedStatement = conexao.prepareStatement(sql);
        rs = preparedStatement.executeQuery(sql);

        while (rs.next()) {
             duplicado = false;
            for (int i = 0; i < listaContasPagar.size(); i++) {
                if (listaContasPagar.get(i).getIdContasPagar()== rs.getInt("idContasPagar")) {
                    duplicado = true;
                    break;
                }
            }
            if (!duplicado) {
            ContasPagar contasPagar = new ContasPagar();
            contasPagar.setIdContasPagar(rs.getInt("idContasPagar"));
            contasPagar.setDescricaoConta(rs.getString("descricaoConta"));
            contasPagar.setDataPagamento(rs.getString("dataPagamento"));
            contasPagar.setDataVencimento(rs.getString("dataVencimento"));
            contasPagar.setDataCadastro(rs.getString("dataCadastro"));
            listaContasPagar.add(contasPagar);
                duplicado = false;
            }
        }

        sql = "select * from tb_contaspagar where dataCadastro LIKE '%" + parametro + "%'";

        preparedStatement = conexao.prepareStatement(sql);
        rs = preparedStatement.executeQuery(sql);

        while (rs.next()) {
             duplicado = false;
            for (int i = 0; i < listaContasPagar.size(); i++) {
                if (listaContasPagar.get(i).getIdContasPagar()== rs.getInt("idContasPagar")) {
                    duplicado = true;
                    break;
                }
            }
            if (!duplicado) {
            ContasPagar contasPagar = new ContasPagar();
            contasPagar.setIdContasPagar(rs.getInt("idContasPagar"));
            contasPagar.setDescricaoConta(rs.getString("descricaoConta"));
            contasPagar.setDataPagamento(rs.getString("dataPagamento"));
            contasPagar.setDataVencimento(rs.getString("dataVencimento"));
            contasPagar.setDataCadastro(rs.getString("dataCadastro"));
            listaContasPagar.add(contasPagar);
                duplicado = false;
            }
        }        
        return listaContasPagar;
    }
    
    public ContasPagar buscaContasPagarPorId(int id) throws SQLException {
        
        String sql = "select * from tb_contaspagar where idContasPagar = " + id + " LIMIT 1";

        PreparedStatement preparedStatement = conexao.prepareStatement(sql);
        ResultSet rs = preparedStatement.executeQuery(sql);

        ContasPagar contasPagar = new ContasPagar();

        while (rs.next()) {
            contasPagar.setIdContasPagar(rs.getInt("idContasPagar"));
            contasPagar.setDescricaoConta(rs.getString("descricaoConta"));
            contasPagar.setDataPagamento(rs.getString("dataPagamento"));
            contasPagar.setDataVencimento(rs.getString("dataVencimento"));
            contasPagar.setDataCadastro(rs.getString("dataCadastro"));
        }

        return contasPagar;
    }
      
    public void excluiContasPagarPorId(int id) {
        String sql = "delete from tb_contaspagar where idContasPagar = " + id ;
        
        try {
            PreparedStatement stmt = this.conexao.prepareStatement(sql);
            stmt.execute();
            stmt.close();
        } catch (SQLException ex) {
            Logger.getLogger(UsuarioDao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
      
    public List<ContasReceber> listaContasReceberParametros(String parametro) throws SQLException {
        // prepara a conexão
        boolean duplicado = false;
        List<ContasReceber> listaContasReceber = new ArrayList<>();

        String sql = "select * from tb_contasreceber where descricaoConta LIKE '%" + parametro + "%'";

        PreparedStatement preparedStatement = conexao.prepareStatement(sql);
        ResultSet rs = preparedStatement.executeQuery(sql);

        while (rs.next()) {
            ContasReceber contasReceber = new ContasReceber();
            contasReceber.setIdContasReceber(rs.getInt("idContasReceber"));
            contasReceber.setDescricaoConta(rs.getString("descricaoConta"));
            contasReceber.setDataCadastro(rs.getString("dataCadastro"));
            contasReceber.setDataVencimento(rs.getString("dataVencimento"));
            contasReceber.setDataRecebimento(rs.getString("dataRecebimento"));
            listaContasReceber.add(contasReceber);
        }

        sql = "select * from tb_contasreceber where dataCadastro LIKE '%" + parametro + "%'";

        preparedStatement = conexao.prepareStatement(sql);
        rs = preparedStatement.executeQuery(sql);

        while (rs.next()) {
             duplicado = false;
            for (int i = 0; i <= listaContasReceber.size(); i++) {
                if (listaContasReceber.get(i).getIdContasReceber()== rs.getInt("idContasReceber")) {
                    duplicado = true;
                    break;
                }
            }
            if (!duplicado) {
            ContasReceber contasReceber = new ContasReceber();
            contasReceber.setIdContasReceber(rs.getInt("idContasReceber"));
            contasReceber.setDescricaoConta(rs.getString("descricaoConta"));
            contasReceber.setDataCadastro(rs.getString("dataCadastro"));
            contasReceber.setDataVencimento(rs.getString("dataVencimento"));
            contasReceber.setDataRecebimento(rs.getString("dataRecebimento"));
            listaContasReceber.add(contasReceber);
                duplicado = false;
            }
        }

        sql = "select * from tb_contasreceber where dataVencimento LIKE '%" + parametro + "%'";

        preparedStatement = conexao.prepareStatement(sql);
        rs = preparedStatement.executeQuery(sql);

        while (rs.next()) {
             duplicado = false;
            for (int i = 0; i <= listaContasReceber.size(); i++) {
                if (listaContasReceber.get(i).getIdContasReceber()== rs.getInt("idContasReceber")) {
                    duplicado = true;
                    break;
                }
            }
            if (!duplicado) {
            ContasReceber contasReceber = new ContasReceber();
            contasReceber.setIdContasReceber(rs.getInt("idContasReceber"));
            contasReceber.setDescricaoConta(rs.getString("descricaoConta"));
            contasReceber.setDataCadastro(rs.getString("dataCadastro"));
            contasReceber.setDataVencimento(rs.getString("dataVencimento"));
            contasReceber.setDataRecebimento(rs.getString("dataRecebimento"));
            listaContasReceber.add(contasReceber);
                duplicado = false;
            }
        }

        sql = "select * from tb_contasreceber where dataRecebimento LIKE '%" + parametro + "%'";

        preparedStatement = conexao.prepareStatement(sql);
        rs = preparedStatement.executeQuery(sql);

        while (rs.next()) {
             duplicado = false;
            for (int i = 0; i <= listaContasReceber.size(); i++) {
                if (listaContasReceber.get(i).getIdContasReceber()== rs.getInt("idContasReceber")) {
                    duplicado = true;
                }
            }
            if (!duplicado) {
            ContasReceber contasReceber = new ContasReceber();
            contasReceber.setIdContasReceber(rs.getInt("idContasReceber"));
            contasReceber.setDescricaoConta(rs.getString("descricaoConta"));
            contasReceber.setDataCadastro(rs.getString("dataCadastro"));
            contasReceber.setDataVencimento(rs.getString("dataVencimento"));
            contasReceber.setDataRecebimento(rs.getString("dataRecebimento"));
            listaContasReceber.add(contasReceber);
                duplicado = false;
            }
        }        
        return listaContasReceber;
    }
    
     public ContasReceber buscaContasReceberPorId(int id) throws SQLException {
        
        String sql = "select * from tb_contasreceber where idContasReceber = " + id + " LIMIT 1";

        PreparedStatement preparedStatement = conexao.prepareStatement(sql);
        ResultSet rs = preparedStatement.executeQuery(sql);

        ContasReceber contasReceber = new ContasReceber();

        while (rs.next()) {
            contasReceber.setIdContasReceber(rs.getInt("idContasReceber"));
            contasReceber.setDescricaoConta(rs.getString("descricaoConta"));
            contasReceber.setDataRecebimento(rs.getString("dataRecebimento"));
            contasReceber.setDataVencimento(rs.getString("dataVencimento"));
            contasReceber.setDataCadastro(rs.getString("dataCadastro"));
        }

        return contasReceber;
    }
     
     public void excluiContasReceberPorId(int id) {
        String sql = "delete from tb_contasreceber where idContasReceber = " + id ;
        
        try {
            PreparedStatement stmt = this.conexao.prepareStatement(sql);
            stmt.execute();
            stmt.close();
        } catch (SQLException ex) {
            Logger.getLogger(UsuarioDao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
